package cn.cool.middleware.biz_exception_retry.types.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 业务异常重试注解 BizExceptionRetry
 *
 * 使用方式：
 * @BizExceptionRetry(exceptionType="业务异常类型", exceptionDesc="业务异常描述",
 * retryBeanName="自定义重试逻辑的Bean对象 BeanName", objectIdExpr="$0.id", maxRetryNum=6)
 */
@Target({ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface BizExceptionRetry {
    /** 业务异常类型，必填 不能超过 128个字节 */
    String exceptionType();

    /** 业务异常描述 必填 超过128个字符就截断 */
    String exceptionDesc() default "";

    /** 业务异常重试 BeanName，如果不为空，则在目标方法补偿成功后调用；*/
    String retryBeanName() default "";

    /** 业务 key，非必填 */
    String objectIdExpr() default "";

    /** 最大重试次数，默认6次 */
    int maxRetryNum() default 6;

    /** 是否开启内存重试，默认开启（需要结合） */
    boolean enableMemoryRetry() default true;

    /** 内存重试最大次数，默认最大次数为 0（需要结合 enableMemoryRetry=true ） */
    int memoryRetryMaxNum() default 0;

    /** 内存重试间隔时间（单位：毫秒），默认1s  enableMemoryRetry=true & memoryRetryMaxNum>0 时生效*/
    long memoryRetryIntervalMillis() default 1000;

    /** 异常重试的类型 */
    BizWithException exception() default @BizWithException;

    /** 结果重试 */
    BizWithResult result() default @BizWithResult;
}
